package elm.entity.po;
import jakarta.persistence.*;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Optional;

/**
 * 订单实体类
 * 对应数据库中的订单表，包含订单的基本信息和关联的用户、商家
 */
@Schema(description = "订单实体类，对应数据库中的订单表，包含订单的基本信息和关联的用户、商家")
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "orders")
public class Order {
    /**
     * 订单唯一标识符
     * 自增主键
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Schema(description = "订单唯一标识符，自增主键", example = "1")
    private Long id;

    /**
     * 关联的用户
     * 与User实体形成多对一关系
     */
    @ManyToOne
    @Schema(description = "关联的用户，表示该订单所属的用户")
    private User user;

    /**
     * 关联的商家
     * 与Business实体形成多对一关系
     */
    @ManyToOne
    @Schema(description = "关联的商家，表示该订单所属的商家")
    private Business business;

    /**
     * 订单总金额
     */
    @Schema(description = "订单总金额", example = "50.00")
    private BigDecimal totalPrice;

    /**
     * 配送费用
     */
    @Schema(description = "配送费用", example = "5.00")
    private BigDecimal deliveryFee;

    /**
     * 订单状态
     * 使用OrderStatus枚举类型表示订单的当前状态
     */
    @Enumerated(EnumType.STRING)
    @Schema(description = "订单状态，使用OrderStatus枚举类型表示订单的当前状态", example = "PENDING")
    private OrderStatus status;

    /**
     * 创建时间
     * 记录订单创建的时间
     */
    @Schema(description = "创建时间，记录订单创建的时间", example = "2023-09-01T12:00:00")
    private LocalDateTime createdAt;

    public void setStatus(String status) {
        this.status = OrderStatus.valueOf(status);
    }
}

/**
 * 订单状态枚举
 * 表示订单的生命周期状态
 */
@Schema(description = "订单状态枚举，表示订单的生命周期状态")
enum OrderStatus {
    /**
     * 待支付
     */
    @Schema(description = "待支付状态")
    PENDING,

    /**
     * 处理中
     */
    @Schema(description = "处理中状态")
    PROCESSING,

    /**
     * 已送达
     */
    @Schema(description = "已送达状态")
    DELIVERED,

    /**
     * 已取消
     */
    @Schema(description = "已取消状态")
    CANCELLED
}

